home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / AMICUS / AMICUS24.ADF / CodeDemo / Scroll.asm < prev    next >
Assembly Source File  |  1988-04-16  |  7KB  |  129 lines

  1.                ORIGIN  START
  2. PLANE1         EQUATE  $00               ;DECLARE DATA OFFSETS
  3. PLANE2         EQUATE  $04               ;FROM PARAMETER REGISTER A0
  4. SIZE           EQUATE  $08               ;PASSED FROM MODULA2
  5.  
  6. START          MOVEM.L D0-D7/A0-A6,-(A7) ;SAVE REGISTERS ON STACK
  7.  
  8.                CLR.L   D7                ;CLEAR PLANE WIDTH REGISTER
  9.                MOVE.W  SIZE(A0),D7       ;GET PLANE SIZE
  10.                BEQ     QUIT              ;QUIT IF SIZE IS ZERO
  11.                MOVE.L  D7,D4             ;GET PLANESIZE
  12.                LSR     #1,D4             ;SHIFT TO HALVE
  13.                SUBQ.L  #1,D4             ;ADJUST FOR DBRA IN LOOP
  14.                DIVU    #200,D7           ;CALCULATE PLANE WIDTH IN WORDS
  15.                SUBQ.W  #2,D7             ;ADJUST FOR USE AS LOOP COUNT
  16.                MOVE.L  #4,D1             ;INITIALIZE STROBE COUNTER
  17.                MOVE.L  PLANE2(A0),A3     ;GET PLANE2 ADDRESS
  18.  
  19.  
  20.                MOVE.L  #320,D6           ;TOTAL REPETITIONS
  21. LOOP3          TST.W   SIZE(A0)          ;CHECK FOR INTERRUPT
  22.                BEQ     QUIT              ;QUIT IF CLEARED BY INTERRUPT
  23.                MOVE.L  PLANE1(A0),A1     ;GET PLANE1 ADDRESS
  24.                MOVE.L  PLANE2(A0),A2     ;GET PLANE2 ADDRESS
  25.  
  26.                MOVE.L  #199,D2           ;SET HORIZONTAL SIZE LOOP COUNT
  27. LOOP2          MOVE.L  D7,D3             ;RESET LOOP COUNTER
  28.                CLR.L   D0                ;INITIALIZE BITCATCHER REGISTER
  29.                ASL     (A1)+             ;START HORIZONTAL SHIFT OF PLANE1
  30.                BCC     SKIP              ;SKIP IF BIT WAS 0
  31.                BSET    #0,D0             ;SAVE SHIFTED BIT
  32. SKIP           BTST.B  #7,(A1)           ;CHECK HIGH BIT OF NEXT WORD
  33.                BEQ     SKIP1             ;SKIP IF BIT WAS 0
  34.                BSET.B  #0,-1(A1)         ;MOVE TO LOW BIT OF PREVIOUS WORD
  35. SKIP1          ASL     (A2)+             ;START HORIZONTAL SHIFT OF PLANE2
  36.                BCC     SKIP2             ;SKIP IF BIT WAS 0
  37.                BSET    #1,D0             ;SAVE SHIFTED BIT
  38. SKIP2          BTST.B  #7,(A2)           ;CHECK HIGH BIT OF NEXT WORD
  39.                BEQ     LOOP              ;SKIP IF BIT WAS 0
  40.                BSET.B  #0,-1(A2)         ;MOVE TO LOW BIT OF PREVIOUS WORD
  41. LOOP           ASL     (A1)+             ;SHIFT REST OF LINE IN PLANE1
  42.                BTST.B  #7,(A1)           ;CHECK HIGH BIT OF NEXT WORD
  43.                BEQ     SKIP3             ;SKIP IF BIT WAS 0
  44.                BSET.B  #0,-1(A1)         ;MOVE TO LOW BIT OF PREVIOUS WORD
  45. SKIP3          ASL     (A2)+             ;SHIFT REST OF LINE IN PLANE2
  46.                BTST.B  #7,(A2)           ;CHECK HIGH BIT OF NEXT WORD
  47.                BEQ     SKIP4             ;SKIP IF BIT WAS 0
  48.                BSET.B  #0,-1(A2)         ;MOVE TO LOW BIT OF PREVIOUS WORD
  49. SKIP4          DBRA    D3,LOOP           ;LOOP TILL LINE DONE
  50.                BCLR.B  #0,-1(A1)         ;CLEAR LOW BIT OF LAST WORD
  51.                BCLR.B  #0,-1(A2)         ;CLEAR LOW BIT OF LAST WORD
  52.                BTST    #0,D0             ;CHECK FOR BIT FROM START OF LINE
  53.                BEQ     SKIP5             ;SKIP IF BIT WAS 0
  54.                ADDQ.B  #1,-1(A1)         ;SHIFT BIT FROM START OF LINE
  55. SKIP5          BTST    #1,D0             ;CHECK FOR BIT FROM START OF LINE
  56.                BEQ     SKIP6             ;SKIP IF BIT WAS 0
  57.                ADDQ.B  #1,-1(A2)         ;SHIFT BIT FROM START OF LINE
  58. SKIP6          DBRA    D2,LOOP2          ;LOOP TILL PLANES ARE SHIFTED
  59.  
  60.                DBRA    D1,SKIPSTROBE     ;SKIP COLOR CHANGE
  61.                MOVE.L  D4,D5             ;GET PLANESIZE
  62.                MOVE.L  A3,A4             ;GET PLANE ADDRESS
  63. COLORLOOP      MOVE.L  (A4),D1           ;GET PLANELONGWORD
  64.                EORI.L  #$80008000,D1     ;REVERSE BITS
  65.                MOVE.L  D1,(A4)+          ;REPLACE PLANELONGWORD
  66.                DBRA    D5,COLORLOOP      ;LOOP
  67.                MOVE.L  #4,D1             ;RESET COUNTER           
  68. SKIPSTROBE     DBRA    D6,LOOP3          ;LOOP TILL SCROLL DONE
  69.  
  70.                                          ;SCROLL PLANE1
  71.  
  72.                MOVE.L  #318,D6           ;TOTAL REPETITIONS
  73. LOOP3A         TST.W   SIZE(A0)          ;CHECK FOR INTERRUPT
  74.                BEQ     QUIT              ;QUIT IF CLEARED BY INTERRUPT
  75.                MOVE.L  PLANE1(A0),A1     ;GET PLANE1 ADDRESS
  76.                MOVE.L  #199,D2           ;SET HORIZONTAL SIZE LOOP COUNT
  77.  
  78. LOOP2A         MOVE.L  D7,D3             ;RESET LOOP COUNTER
  79.                CLR.L   D0                ;INITIALIZE BITCATCHER REGISTER
  80.                ASL     (A1)+             ;START HORIZONTAL SHIFT OF PLANE1
  81.                BCC     SKIPA             ;SKIP IF BIT WAS 0
  82.                BSET    #0,D0             ;SAVE SHIFTED BIT
  83. SKIPA          BTST.B  #7,(A1)           ;CHECK HIGH BIT OF NEXT WORD
  84.                BEQ     LOOPA             ;SKIP IF BIT WAS 0
  85.                BSET.B  #0,-1(A1)         ;MOVE TO LOW BIT OF PREVIOUS WORD
  86. LOOPA          ASL     (A1)+             ;SHIFT REST OF LINE IN PLANE1
  87.                BTST.B  #7,(A1)           ;CHECK HIGH BIT OF NEXT WORD
  88.                BEQ     SKIP3A            ;SKIP IF BIT WAS 0
  89.                BSET.B  #0,-1(A1)         ;MOVE TO LOW BIT OF PREVIOUS WORD
  90. SKIP3A         DBRA    D3,LOOPA          ;LOOP TILL LINE DONE
  91.                BCLR.B  #0,-1(A1)         ;CLEAR LOW BIT OF LAST WORD
  92.                BTST    #0,D0             ;CHECK FOR BIT FROM START OF LINE
  93.                BEQ     SKIP5A            ;SKIP IF BIT WAS 0
  94.                ADDQ.B  #1,-1(A1)         ;SHIFT BIT FROM START OF LINE
  95. SKIP5A         DBRA    D2,LOOP2A         ;LOOP TILL PLANES ARE SHIFTED
  96.                DBRA    D6,LOOP3A         ;LOOP TILL SCROLL DONE
  97.  
  98.                                          ;SCROLL PLANE2
  99.  
  100.                MOVE.L  #318,D6           ;TOTAL REPETITIONS
  101. LOOP3B         TST.W   SIZE(A0)          ;CHECK FOR INTERRUPT
  102.                BEQ     QUIT              ;QUIT IF CLEARED BY INTERRUPT
  103.                MOVE.L  PLANE2(A0),A1     ;GET PLANE1 ADDRESS
  104.                MOVE.L  #199,D2           ;SET HORIZONTAL SIZE LOOP COUNT
  105.  
  106. LOOP2B         MOVE.L  D7,D3             ;RESET LOOP COUNTER
  107.                CLR.L   D0                ;INITIALIZE BITCATCHER REGISTER
  108.                ASL     (A1)+             ;START HORIZONTAL SHIFT OF PLANE1
  109.                BCC     SKIPB             ;SKIP IF BIT WAS 0
  110.                BSET    #0,D0             ;SAVE SHIFTED BIT
  111. SKIPB          BTST.B  #7,(A1)           ;CHECK HIGH BIT OF NEXT WORD
  112.                BEQ     LOOPB             ;SKIP IF BIT WAS 0
  113.                BSET.B  #0,-1(A1)         ;MOVE TO LOW BIT OF PREVIOUS WORD
  114. LOOPB          ASL     (A1)+             ;SHIFT REST OF LINE IN PLANE1
  115.                BTST.B  #7,(A1)           ;CHECK HIGH BIT OF NEXT WORD
  116.                BEQ     SKIP3B            ;SKIP IF BIT WAS 0
  117.                BSET.B  #0,-1(A1)         ;MOVE TO LOW BIT OF PREVIOUS WORD
  118. SKIP3B         DBRA    D3,LOOPB          ;LOOP TILL LINE DONE
  119.                BCLR.B  #0,-1(A1)         ;CLEAR LOW BIT OF LAST WORD
  120.                BTST    #0,D0             ;CHECK FOR BIT FROM START OF LINE
  121.                BEQ     SKIP5B            ;SKIP IF BIT WAS 0
  122.                ADDQ.B  #1,-1(A1)         ;SHIFT BIT FROM START OF LINE
  123. SKIP5B         DBRA    D2,LOOP2B         ;LOOP TILL PLANES ARE SHIFTED
  124.                DBRA    D6,LOOP3B         ;LOOP TILL SCROLL DONE
  125.  
  126.  
  127. QUIT           MOVEM.L (A7)+,D0-D7/A0-A6 ;RESTORE REGISTERS FROM STACK
  128.                END                       ;FINISHED SCROLLING
  129.